<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>

  </style>
</head>
<body>

</body>
</html>

<script>
// 改变函数的 this 指向

// 方法1：
/* fn.call(context, 实参1, 实参2, ...);
    调用 call 本质是 直接 执行 fn

  案例：
    yo.call({name: '张三', age: 33}, 'a', 'b');
*/


// 方法2：
/* fn.apply(context, [实参1, 实参2], ...);
    调用 apply 本质是 直接 执行 fn

    注：其和 call 唯一的区别是：apply 传入的实参是 放到 一个数组里面

  用法：
    yo.apply({name: '小明'}, ['aa', 'bb'])

  案例：
    const arr = [1, 2, 3, 4, 12, 214, 12, 1, 1, 2, 3];
    Math.max.apply(null, arr);
*/


function yo(a, b) {
  console.log(`yo - 1S`, this);
  console.log('形参值', a, b);
}


// 方法3：
/* fn.bind(context, 参数1, 参数2, ...) 
    与call的不同之处：
      1）返回值是一个新的函数。
      2）若有实参，实参会“封装”进新的函数；新的函数执行时，会默认带有 封装进去的 实参。
*/
// const fn = yo.bind({name: 'bind'}, 'a1a');
// fn('b2b2');

function add(x, y) {
  return x + y;
}

// 需求：频繁做一个事儿：但凡有一个数，就要 +9；
// 本质：add9 叫 add 函数的「柯里化」
const add9 = add.bind(null, 9);

console.log(add9(11));
// const x = 'xxx';
// add(9, x);


</script> 